#ifndef _IND_ARBOL_CLAS_H_
#define _IND_ARBOL_CLAS_H_

/********************************************************************
 * IndBClas.h
 * 
 * Descripcion :Esta clase representa un archivo de indice secundario.
 * Implementado con un arbol B o un arbol B+, dependiendo del TipoArchivo 
 * pasado por param en el constructor.
*********************************************************************/

#include "indice_sec.h"
#include "arbol_b.h"
#include "arbol_b_mas.h"
#include "arch_overflow.h"

class IndArbolClas: public IndiceSec{
	private:
		ArbolB * arbol;
		ArchOverflow * arch_overflow;
		TiposArchivo tipo;
		
	public:

		IndArbolClas(std::string& nombre, unsigned int tam_bloque, 
				unsigned int tam_bloque_indice, unsigned int num_campo_clave,TiposArchivo tipo_indice);
	
		~IndArbolClas();
		
		void crear(std::string formato) throw(ExcepCreandoArch, ExcepSintaxisParser, ExcepBloqueTam);
 		
 		void ingresar(TipoStruct * reg) throw(ExcepArchCerrado,ExcepRegExistente, ExcepBloqueTam);
		
		void quitar(TipoStruct* reg) throw(ExcepArchCerrado);
		
		bool consultar(std::vector<ParesDatos*> &consultas, std::vector<TipoStruct*> &resultado)
									 throw(ExcepArchCerrado,ExcepLeerBloque);
									 
		unsigned int get_cant_regs() throw(ExcepArchCerrado);

		void abrir() throw(ExcepAbriendoArch);
		
		void cerrar();
 		
 	 	void eliminar();
 	 	
 	 	TiposArchivo get_tipo_archivo(){return NINGUNO;}
 		
 		unsigned int get_espacio_libre()  throw(ExcepArchCerrado, ExcepLeerBloque);
	
		long get_tam() throw(ExcepArchCerrado);
 		
 		//void actualizar(TipoDato* clave, int bloque_nuevo) throw(ExcepArchCerrado,ExcepRegInexistente, ExcepBloqueTam);
 		
	private:
		
		TipoStruct* generar_reg_oflow(int dato);

 		TipoDato* generar_clave_arbol(std::vector<ParesDatos*> &consultas);


};

#endif

